#!/usr/bin/python3
# -*- coding: utf-8 -*-
# ======================================#
# @Author   : duanqizhong
# @time     : 2020-12-26 12:08
# @file     : stock
# @Software : PyCharm
# ======================================#
import baostock as bs
import pandas

from config import HISTORY_K_DATA_PLUS


class Stock:
    def __init__(self):
        self.login = bs.login()

    def logout(self):
        bs.logout()

    def all_stock(self, day="2020-12-12"):
        """证券代码信息
        参数名称	参数描述
        code	证券代码
        tradeStatus	交易状态(1：正常交易 0：停牌）
        code_name	证券名称
        """
        return bs.query_all_stock(day=day)

    def stock_industry(self):
        """获取行业分类信息，每周更新一次
        参数名称	参数描述
        updateDate	更新日期
        code	证券代码
        code_name	证券名称
        industry	所属行业
        industryClassification	所属行业类别
        """
        return bs.query_stock_industry()

    def history_k_data(self,code, fields,start_date="1970-01-01", end_date=None, frequency='d', adjustflag="3"):
        print(f"{code}\t{fields}\t{start_date}\t{end_date}\t{frequency}\t{adjustflag}")
        return bs.query_history_k_data(code,fields=fields,start_date=start_date,end_date=end_date,frequency=frequency,adjustflag=adjustflag)

    def history_k_data_plus(self, code, start_date="1970-01-01", end_date=None, frequency='d', adjustflag="3"):
        """
        历史A股K线数据
        :param code:        股票代码
        :param fileds:      查询字段
        :param start_date:  开始日期
        :param end_date:    结束日期
        :param frequency:   数据频率：d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据
        :param adjustflag:  复权类型，默认不复权：3；1：后复权；2：前复权。已支持分钟线、日线、周线、月线前后复权
        :return:
        """
        return bs.query_history_k_data_plus(code, fields=HISTORY_K_DATA_PLUS[frequency], start_date=start_date,
                                            end_date=end_date, frequency=frequency, adjustflag=adjustflag)

    def dividend_data(self, code, year, yearType="report"):
        """除权除息信息"""
        """
        参数名称	参数描述	算法说明
        code	证券代码	
        dividPreNoticeDate	预批露公告日	
        dividAgmPumDate	股东大会公告日期	
        dividPlanAnnounceDate	预案公告日	
        dividPlanDate	分红实施公告日	
        dividRegistDate	股权登记告日	
        dividOperateDate	除权除息日期	
        dividPayDate	派息日	
        dividStockMarketDate	红股上市交易日	
        dividCashPsBeforeTax	每股股利税前	派息比例分子(税前)/派息比例分母
        dividCashPsAfterTax	每股股利税后	派息比例分子(税后)/派息比例分母
        dividStocksPs	每股红股	
        dividCashStock	分红送转	每股派息数(税前)+每股送股数+每股转增股本数
        dividReserveToStockPs	每股转增资本	
        """
        return bs.query_dividend_data(code, year, yearType=yearType)

    def adjust_factor(self,code,start_date="1990-01-01",end_date="2099-01-01"):
        """复权因子"""
        return bs.query_adjust_factor(code,start_date=start_date,end_date=end_date)

    def profit_data(self,code,year,quarter=None):
        """
        季频盈利能力
        :param code:
        :param year:
        :param quarter: 1,2,3,4季度
        :return:
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        roeAvg	净资产收益率(平均)(%)	归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100%
        npMargin	销售净利率(%)	净利润/营业收入*100%
        gpMargin	销售毛利率(%)	毛利/营业收入*100%=(营业收入-营业成本)/营业收入*100%
        netProfit	净利润(元)
        epsTTM	每股收益	归属母公司股东的净利润TTM/最新总股本
        MBRevenue	主营营业收入(元)
        totalShare	总股本
        liqaShare	流通股本
        """
        return bs.query_profit_data(code,year,quarter=quarter)

    def operation_data(self,code,year,quarter):
        """季频营运能力
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        NRTurnRatio	应收账款周转率(次)	营业收入/[(期初应收票据及应收账款净额+期末应收票据及应收账款净额)/2]
        NRTurnDays	应收账款周转天数(天)	季报天数/应收账款周转率(一季报：90天，中报：180天，三季报：270天，年报：360天)
        INVTurnRatio	存货周转率(次)	营业成本/[(期初存货净额+期末存货净额)/2]
        INVTurnDays	存货周转天数(天)	季报天数/存货周转率(一季报：90天，中报：180天，三季报：270天，年报：360天)
        CATurnRatio	流动资产周转率(次)	营业总收入/[(期初流动资产+期末流动资产)/2]
        AssetTurnRatio	总资产周转率	营业总收入/[(期初资产总额+期末资产总额)/2]
        """
        return bs.query_operation_data(code,year,quarter=quarter)

    def growth_data(self,code,year,quarter=None):
        """季频成长能力
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        YOYEquity	净资产同比增长率	(本期净资产-上年同期净资产)/上年同期净资产的绝对值*100%
        YOYAsset	总资产同比增长率	(本期总资产-上年同期总资产)/上年同期总资产的绝对值*100%
        YOYNI	净利润同比增长率	(本期净利润-上年同期净利润)/上年同期净利润的绝对值*100%
        YOYEPSBasic	基本每股收益同比增长率	(本期基本每股收益-上年同期基本每股收益)/上年同期基本每股收益的绝对值*100%
        YOYPNI	归属母公司股东净利润同比增长率	(本期归属母公司股东净利润-上年同期归属母公司股东净利润)/上年同期归属母公司股东净利润的绝对值*100%
        """
        return bs.query_growth_data(code,year,quarter=quarter)

    def balance_data(self,code,year,quarter=None):
        """季频偿债能力
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        currentRatio	流动比率	流动资产/流动负债
        quickRatio	速动比率	(流动资产-存货净额)/流动负债
        cashRatio	现金比率	(货币资金+交易性金融资产)/流动负债
        YOYLiability	总负债同比增长率	(本期总负债-上年同期总负债)/上年同期中负债的绝对值*100%
        liabilityToAsset	资产负债率	负债总额/资产总额
        assetToEquity	权益乘数	资产总额/股东权益总额=1/(1-资产负债率)
        """
        return bs.query_balance_data(code,year,quarter=quarter)

    def cash_flow_data(self,code,year,quarter=None):
        """季频现金流量
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        CAToAsset	流动资产除以总资产
        NCAToAsset	非流动资产除以总资产
        tangibleAssetToAsset	有形资产除以总资产
        ebitToInterest	已获利息倍数	息税前利润/利息费用
        CFOToOR	经营活动产生的现金流量净额除以营业收入
        CFOToNP	经营性现金净流量除以净利润
        CFOToGr	经营性现金净流量除以营业总收入
        """
        return bs.query_cash_flow_data(code,year,quarter=quarter)

    def dupont_data(self,code,year,quarter=None):
        """季频杜邦指数
        参数名称	参数描述	算法说明
        code	证券代码
        pubDate	公司发布财报的日期
        statDate	财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30
        dupontROE	净资产收益率	归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100%
        dupontAssetStoEquity	权益乘数，反映企业财务杠杆效应强弱和财务风险	平均总资产/平均归属于母公司的股东权益
        dupontAssetTurn	总资产周转率，反映企业资产管理效率的指标	营业总收入/[(期初资产总额+期末资产总额)/2]
        dupontPnitoni	归属母公司股东的净利润/净利润，反映母公司控股子公司百分比。如果企业追加投资，扩大持股比例，则本指标会增加。
        dupontNitogr	净利润/营业总收入，反映企业销售获利率
        dupontTaxBurden	净利润/利润总额，反映企业税负水平，该比值高则税负较低。净利润/利润总额=1-所得税/利润总额
        dupontIntburden	利润总额/息税前利润，反映企业利息负担，该比值高则税负较低。利润总额/息税前利润=1-利息费用/息税前利润
        dupontEbittogr	息税前利润/营业总收入，反映企业经营利润率，是企业经营获得的可供全体投资人（股东和债权人）分配的盈利占企业全部营收收入的百分比
        """
        print(f"{code}\t{year}\t{quarter}")
        return bs.query_dupont_data(code,year,quarter=quarter)

    def performance_express_report(self,code,start_date="1990-01-01",end_date="2099-01-01"):
        """季频公司业绩快报
        参数名称	参数描述
        code	证券代码
        performanceExpPubDate	业绩快报披露日
        performanceExpStatDate	业绩快报统计日期
        performanceExpUpdateDate	业绩快报披露日(最新)
        performanceExpressTotalAsset	业绩快报总资产
        performanceExpressNetAsset	业绩快报净资产
        performanceExpressEPSChgPct	业绩每股收益增长率
        performanceExpressROEWa	业绩快报净资产收益率ROE-加权
        performanceExpressEPSDiluted	业绩快报每股收益EPS-摊薄
        performanceExpressGRYOY	业绩快报营业总收入同比
        performanceExpressOPYOY	业绩快报营业利润同比
        """
        return bs.query_performance_express_report(code,start_date=start_date,end_date=end_date)

    def forcast_report(self,code,start_date="1990-01-01",end_date="2099-01-01"):
        """季频公司业绩预告
        参数名称	参数描述
        code	证券代码
        profitForcastExpPubDate	业绩预告发布日期
        profitForcastExpStatDate	业绩预告统计日期
        profitForcastType	业绩预告类型
        profitForcastAbstract	业绩预告摘要
        profitForcastChgPctUp	预告归属于母公司的净利润增长上限(%)
        profitForcastChgPctDwn	预告归属于母公司的净利润增长下限(%)
        """
        return bs.query_forecast_report(code,start_date=start_date,end_date=end_date)

    def trade_dates(self,start_date="1990-01-01",end_date="2099-01-01"):
        """获取证券元信息：交易日查询
        参数名称	参数描述
        calendar_date	日期
        is_trading_day	是否交易日(0:非交易日;1:交易日)
        """
        return bs.query_trade_dates(start_date=start_date,end_date=end_date)

    def stock_basic(self,code=None,code_name=None):
        """证券基本资料
        参数名称	参数描述
        code	证券代码
        code_name	证券名称
        ipoDate	上市日期
        outDate	退市日期
        type	证券类型，其中1：股票，2：指数,3：其它
        status	上市状态，其中1：上市，0：退市
        """
        return bs.query_stock_basic(code=code,code_name=code_name)

    def deposit_rate_date(self,start_date="1990-01-01",end_date="2099-01-01"):
        """存款利率
        参数名称	参数描述
        pubDate	发布日期
        demandDepositRate	活期存款(不定期)
        fixedDepositRate3Month	定期存款(三个月)
        fixedDepositRate6Month	定期存款(半年)
        fixedDepositRate1Year	定期存款整存整取(一年)
        fixedDepositRate2Year	定期存款整存整取(二年)
        fixedDepositRate3Year	定期存款整存整取(三年)
        fixedDepositRate5Year	定期存款整存整取(五年)
        installmentFixedDepositRate1Year	零存整取、整存零取、存本取息定期存款(一年)
        installmentFixedDepositRate3Year	零存整取、整存零取、存本取息定期存款(三年)
        installmentFixedDepositRate5Year	零存整取、整存零取、存本取息定期存款(五年)
        """
        return bs.query_deposit_rate_data(start_date=start_date,end_date=end_date)

    def loan_rate_data(self,start_date="1990-01-01",end_date="2099-01-01"):
        """贷款利率
        参数名称	参数描述
        pubDate	发布日期
        loanRate6Month	6个月贷款利率
        loanRate6MonthTo1Year	6个月至1年贷款利率
        loanRate1YearTo3Year	1年至3年贷款利率
        loanRate3YearTo5Year	3年至5年贷款利率
        loanRateAbove5Year	5年以上贷款利率
        mortgateRateBelow5Year	5年以下住房公积金贷款利率
        mortgateRateAbove5Year	5年以上住房公积金贷款利率
        """
        return bs.query_loan_rate_data(start_date=start_date,end_date=end_date)

    def required_reserve_ratio_data(self,start_date="1990-01-01",end_date="2099-01-01"):
        """存款准备金率
        参数名称	参数描述
        pubDate	公告日期
        effectiveDate	生效日期
        bigInstitutionsRatioPre	人民币存款准备金率：大型存款类金融机构 调整前
        bigInstitutionsRatioAfter	人民币存款准备金率：大型存款类金融机构 调整后
        mediumInstitutionsRatioPre	人民币存款准备金率：中小型存款类金融机构 调整前
        mediumInstitutionsRatioAfter	人民币存款准备金率：中小型存款类金融机构 调整后
        """
        return bs.query_required_reserve_ratio_data(start_date=start_date,end_date=end_date)

    def money_supply_data_month(self,start_date="1990-01-01",end_date="2099-01-01"):
        """货币供应量
        参数名称	参数描述
        statYear	统计年度
        statMonth	统计月份
        m0Month	货币供应量M0（月）
        m0YOY	货币供应量M0（同比）
        m0ChainRelative	货币供应量M0（环比）
        m1Month	货币供应量M1（月）
        m1YOY	货币供应量M1（同比）
        m1ChainRelative	货币供应量M1（环比）
        m2Month	货币供应量M2（月）
        m2YOY	货币供应量M2（同比）
        m2ChainRelative	货币供应量M2（环比）
        """
        return bs.query_money_supply_data_month(start_date=start_date,end_date=end_date)

    def money_supply_data_year(self,start_date="1990-01-01",end_date="2099-01-01"):
        """货币供应量（年底余额）
        参数名称	参数描述
        statYear	统计年度
        m0Year	年货币供应量M0（亿元）
        m0YearYOY	年货币供应量M0（同比）
        m1Year	年货币供应量M1（亿元）
        m1YearYOY	年货币供应量M1（同比）
        m2Year	年货币供应量M2（亿元）
        m2YearYOY	年货币供应量M2（同比）
        """
        return bs.query_money_supply_data_year(start_date=start_date,end_date=end_date)

    def shibor_data(self,start_date="1990-01-01",end_date="2099-01-01"):
        """银行间同业拆放利率
        参数名称	参数描述
        date	日期
        shiborON	隔夜拆借利率
        shibor1W	1周拆放利率
        shibor2W	2周拆放利率
        shibor1M	1个月拆放利率
        shibor3M	3个月拆放利率
        shibor6M	6个月拆放利率
        shibor9M	9个月拆放利率
        shibor1Y	1年拆放利率
        """
        return bs.query_shibor_data(start_date=start_date,end_date=end_date)

    def sz50_stocks(self,date=""):
        """上证50成分股：每周更新一次
        参数名称	参数描述
        updateDate	更新日期
        code	证券代码
        code_name	证券名称
        """
        return bs.query_sz50_stocks(date=date)

    def hs300_stocks(self,date=""):
        """沪深300成分股：每周更新一次
        参数名称	参数描述
        updateDate	更新日期
        code	证券代码
        code_name	证券名称2
        """
        return bs.query_hs300_stocks(date=date)

    def zz500_stocks(self,date=""):
        """中证500成分股: 每周更新一次
        参数名称	参数描述
        updateDate	更新日期
        code	证券代码
        code_name	证券名称
        """
        return bs.query_zz500_stocks(date=date)

    def test(self):
        pass